package com.example.d4_byte_stream;

import java.io.FileInputStream;
import java.io.InputStream;

/**
 * 目标：掌握使用FileInputStream(文件字节输入流)每次读取多个字节
 */
public class FileInputStreamTest2 {
    public static void main(String[] args) throws Exception {
        // 1.创建一个字节输入流对象代表字节输入流管道与源文件接通
        InputStream is = new FileInputStream("day19-file-io\\src\\yu02.txt");

        // 2.开始读取文件中的字节数据：每次读取多个字节
        //  public int read(byte b[]) throws IOException
        //  每次读取多个字节到字节数组中去,返回读取的字节数量,读取完毕会返回-1
        /*
        byte[] buffer = new byte[3];
        int len = is.read(buffer);
        System.out.println(new String(buffer));
        System.out.println("当次读取的字节数量：" + len);

        // buffer = [abc]
        // buffer = [66c]
        // 这里为什么会多除一个c,因为第一次读取三个字节的时候时abc,
        // 第二次去读取的时候因为只剩下了两个字节会把6放在a的位置第二个6放在b的位置,但是桶中c的数据还在,所有就会多输出一个c
        int len2 = is.read(buffer);
        // 解决方法：使用String重载的一个构造器,0表示从第一个位置开始到len2,表示一次读取了几个字节就输出几个字节这样就不会出现多读的情况
        System.out.println(new String(buffer, 0, len2));
        System.out.println("当次读取的字节数量：" + len2);
        */

        // 3.使用循环改造
        byte[] buffer = new byte[3];
        int len; // 记住每次读取了多少个字节
        while ((len = is.read(buffer)) != -1) {
            String rs = new String(buffer, 0, len);
            System.out.print(rs);
        }

        // 这种存在的缺陷：每次读取多个字节
        // 1.性能得到了明显的提升!!
        // 2.这种方案也不能避免读取汉字输出乱码的问题!!

        is.close(); // 关闭流
    }
}
